package ma.cdm.compteRendu.bo;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.GenericGenerator;

/**
 * Compterendu entity. @author Limouri Anouar
 */
@Entity
@Table(name="compterendu")

public class CompteRendu  implements java.io.Serializable {

	// Fields

	private Long idcompterendu;
	private MembreComite membrecomite;
	private Comite comite;
	private String objetcompterendu;
	private String template;
	private Date datereunion;
	private Set<MembreComite> membrecomites = new HashSet<MembreComite>(0);
	private Set<ParticipantExterne> participantexternes = new HashSet<ParticipantExterne>(
			0);
	private Set<SuiviPoint> suivipoints = new HashSet<SuiviPoint>(0);
	private Set<ParticipantInterne> participantinternes = new HashSet<ParticipantInterne>(
			0);

	// Constructors

	/** default constructor */
	public CompteRendu() {
	}

	/** minimal constructor */
	public CompteRendu(MembreComite membrecomite, Comite comite) {
		this.membrecomite = membrecomite;
		this.comite = comite;
	}

	/** full constructor */
	public CompteRendu(MembreComite membrecomite, Comite comite,
			String objetcompterendu, String template, Date datereunion,
			Set<MembreComite> membrecomites,
			Set<ParticipantExterne> participantexternes,
			Set<SuiviPoint> suivipoints,
			Set<ParticipantInterne> participantinternes) {
		this.membrecomite = membrecomite;
		this.comite = comite;
		this.objetcompterendu = objetcompterendu;
		this.template = template;
		this.datereunion = datereunion;
		this.membrecomites = membrecomites;
		this.participantexternes = participantexternes;
		this.suivipoints = suivipoints;
		this.participantinternes = participantinternes;
	}

	// Property accessors
	@GenericGenerator(name = "generator", strategy = "increment")
	@Id
	@GeneratedValue(generator = "generator")
	@Column(name = "IDCOMPTERENDU", unique = true, nullable = false)
	public Long getIdcompterendu() {
		return this.idcompterendu;
	}

	public void setIdcompterendu(Long idcompterendu) {
		this.idcompterendu = idcompterendu;
	}
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name = "MATRICULE", nullable = false)
	public MembreComite getMembreComite() {
		return this.membrecomite;
	}

	public void setMembreComite(MembreComite membrecomite) {
		this.membrecomite = membrecomite;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "IDCOMITE", nullable = false)
	public Comite getComite() {
		return this.comite;
	}

	public void setComite(Comite comite) {
		this.comite = comite;
	}

	@Column(name = "OBJETCOMPTERENDU", length = 2000)
	public String getObjetcompterendu() {
		return this.objetcompterendu;
	}

	public void setObjetcompterendu(String objetcompterendu) {
		this.objetcompterendu = objetcompterendu;
	}

	@Column(name = "TEMPLATE", length = 200)
	public String getTemplate() {
		return this.template;
	}

	public void setTemplate(String template) {
		this.template = template;
	}

	@Temporal(TemporalType.DATE)
	@Column(name = "DATEREUNION", length = 10)
	public Date getDatereunion() {
		return this.datereunion;
	}

	public void setDatereunion(Date datereunion) {
		this.datereunion = datereunion;
	}

	@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
	@JoinTable(name="membrepresent", joinColumns = { 
	    @JoinColumn(name="IDCOMPTERENDU", nullable=false, updatable=false) }, inverseJoinColumns = { 
	    @JoinColumn(name="MATRICULE", nullable=false, updatable=false) })
	public Set<MembreComite> getMembrecomites() {
		return this.membrecomites;
	}

	public void setMembrecomites(Set<MembreComite> membrecomites) {
		this.membrecomites = membrecomites;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "compteRendu")
	public Set<ParticipantExterne> getParticipantexternes() {
		return this.participantexternes;
	}

	public void setParticipantexternes(
			Set<ParticipantExterne> participantexternes) {
		this.participantexternes = participantexternes;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "compteRendu")
	public Set<SuiviPoint> getSuivipoints() {
		return this.suivipoints;
	}

	public void setSuivipoints(Set<SuiviPoint> suivipoints) {
		this.suivipoints = suivipoints;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "compteRendu")
	public Set<ParticipantInterne> getParticipantinternes() {
		return this.participantinternes;
	}

	public void setParticipantinternes(
			Set<ParticipantInterne> participantinternes) {
		this.participantinternes = participantinternes;
	}

}